package io.filestream;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;

public class FileCopy {
	
	//sourceFile경로의 파일을 targetFile 경로로 카피
	//sourceFile ----> (input 연결) FileCopy P/G (output 연결) ------------------>targetFile
	
	public void copy1(String sourceFile, String targetFile){
	
		FileInputStream fis = null;//파일과 input 연결을 하는 node 스트림 클래스
		FileOutputStream fos = null;//파일과 output 연결을 하는 node 스트림 클래스
		try {
			//1. 연결
			//생성자 인수 - 연결할 파일 경로(파일이 없으면 예외 발생, 있으면 Input  연결 - 읽을 준비 완료)
			fis = new FileInputStream(sourceFile);
			
			//A. 연결(출력할 파일)
			fos = new FileOutputStream(targetFile);
			//(파일 존재하면 : output연결완료 - 출력할 준비 완료! 그리고 덮어쓰기 함 (연결된 파일은 0byte가 되고 새로 쓰여진다)
									//이어쓰기를 하고 싶으면 생성자의 두번째 매개변수에 true를 전달
			//파일이 없으면 : 파일을 생성한다. 그런데 파일 생성권한이 없으면 예외 발생
			

			
			//2. Input 작업(읽는 작업)/Output작업(쓰는작업)
			int i = fis.read();//1byte read - return값은 : 읽은 byte (EOF, 더 이상 읽을 것이 없다. : -1)
			//이 i에는 인풋한 소스파일이 담긴다.
			int cnt = 1;
			while(i!= -1){
				fos.write(i);
				i = fis.read();
				cnt++;
			}//여기까지 온거면 다 읽은것 
			System.out.println("총 인풋 횟수 : "+cnt);
		} catch (FileNotFoundException e){
			System.out.println("-----------------");
			e.printStackTrace();
		} catch (IOException e){
			e.printStackTrace();
		}finally {
			//3. Disconect 작업(반드시 들어가야 하는 작업이다)
			if(fis!= null){//fis가 null이라는건 애초에 연결이 된적이 없다는 것!
				//null이면 연결이 된적이 없는거니까 끊을 필요가 없는거지. 그래서 만약에 null이 아니면 연결이 되었다는 거고 그 연결을 반드시 끊어줘야 하는것!
				try {
					fis.close();
				}catch(IOException e){
					e.printStackTrace();
				}
			}
			if(fos != null){
				try{
					fos.close();
				}catch (IOException e){
					e.printStackTrace();
				}
			}
				//생성자로 연결해서 파이널리로 끊는다.
		}
	}
	
	public void copy2(String sourceFile, String targetFile){
		//berfer(byte배열)을 이용한 입출력 메소드
		
		//1. 연결 
		FileInputStream fis = null;//파일에 연결할꺼니까 파일 인풋 스트림을 사용
		FileOutputStream fos = null;
		int cnt = 1;
		
		try {
//			2, 입출력
			fis = new FileInputStream(sourceFile);
			fos = new FileOutputStream(targetFile);
			byte [] buffer = new byte[100000];
			int i = fis.read(buffer);//읽은 데이터를 버퍼에 저장, 한번 read() 시 최대 10만 바이트를 읽는다.
			
//			return 값 : 읽은 byte 수 , EOF : -1 
			while(i != -1){
				cnt ++;
				//fos.write(buffer);//byte 배열에 가진 값들을 한번에 출력
				fos.write(buffer,0,i);//위와 이 코드의 차이가 뭐지?
				System.out.println(i);
				i = fis.read(buffer);
			}
			System.out.println("읽은 횟수 : "+ cnt);
		} catch(IOException e){
			e.printStackTrace();
		} finally {
			if(fis != null){
				try{
					fis.close();
				}catch(IOException e){
					e.printStackTrace();
				}
			}
			if(fos != null){
				try {
					fos.close();
				}catch(IOException e){
					e.printStackTrace();
				}
			}
		}

		
	}
	
	
	
//	main() -> copy1() -> FileInputStream 생성자
	public static void main(String[] args) {
		FileCopy fc = new FileCopy();
		//fc.copy1("c:\\day\\Penguins.jpg", "c:\\day\\iespeace.jpg");//\\두번 쓰는건 한번만 쓰면 그냥 특수문자로 인식해버리니까
		fc.copy2("c:\\day\\Penguins.jpg", "c:\\day\\iespeace1.jpg");
}
}
